//
//  Model3D_obj_Exporter.hpp
//  C3W_Demo_By_Fan
//
//  Created by 范静涛 on 2024/7/21.
//

//------------------------------------------------------------------------------
//【文件名】Model3D_obj_Exporter.hpp
//【功能模块和目的】导出Model3D到obj文件的导出器类声明
//【开发者及日期】范静涛 2024/7/21
//【更改记录】
//------------------------------------------------------------------------------

#ifndef Model3D_obj_Exporter_hpp
#define Model3D_obj_Exporter_hpp


//Exporter基类模版所属头文件
#include "Exporter.hpp"
//Model3D类所属头文件
#include "Model3D.hpp"
//std::0fstream所属头文件
#include <fstream>

using Model3D_Exporter = Exporter<Model3D>;

//------------------------------------------------------------------------------
//【类名】Model3D_obj_Exporter
//【功能】导出Model3D到obj文件的导出器
//【接口说明】
//    继承得到全部基类接口
//    默认构造函数，手动触发基类构造函数，指定文件扩展名为"obj"
//    虚析构函数（可能做基类）
//    静态：是否压缩导出
//    派生类接口：将Modle3D类型对象导出到文件流的接口override
//【特殊使用说明】需要手动调用Model3D_Exporter::Registr<Model3D_obj_Exporter>()，注册类
//             之后可以通过Model3D_Exporter::GetInstanceXXX获取具体导出器实例
//【开发者及日期】 范静涛 2024/7/21
//【更改记录】
//------------------------------------------------------------------------------
class Model3D_obj_Exporter : public Exporter<Model3D>{
public:
    //--------------------------------------------------------------------------
    //必要的构造、析构、赋值行为
    //--------------------------------------------------------------------------
    //默认构造函数，手动触发基类构造函数，指定文件扩展名为"obj"
    Model3D_obj_Exporter();
    //无拷贝构造，因为基类没有
    Model3D_obj_Exporter(const Model3D_obj_Exporter&) = delete;
    //无赋值运算符，因为基类没有
    Model3D_obj_Exporter& operator=(const Model3D_obj_Exporter&) = delete;
    //虚析构函数（可能做基类），无动态构造成员，默认实现
    virtual ~Model3D_obj_Exporter() = default;
    //--------------------------------------------------------------------------
    //非静态Getter成员函数：需检查所有Getter是否有后置const
    //--------------------------------------------------------------------------
    //将Modle3D类型对象导出到文件流的接口override
    virtual void SaveToStream
         (std::ofstream& Stream, const Model3D& AModel) const override;
    //--------------------------------------------------------------------------
    //静态数据成员
    //--------------------------------------------------------------------------
    //是否压缩导出
    static bool IsCompressedPoints;
protected:
    //--------------------------------------------------------------------------
    //受保护的 非静态Getter成员函数：需检查所有Getter是否有后置const
    //--------------------------------------------------------------------------
    //将Modle3D类型对象"压缩"导出到文件流的接口
    virtual void SaveToStream_Compress
         (std::ofstream& Stream, const Model3D& AModel) const;
};

#endif /* Model3D_obj_Exporter_hpp */
